public final class Grasp extends Ejercicio
{
	public int[] Vo1, Vo2;
	private int cruces;
	
	protected Resultado DGIB
	(
			int n1, int v1[], int n2, int v2[], int m, Eje v1v2[],
			int np1, int vp1[], int np2, int vp2[], int mp, Eje vp1vp2[]
	){
		/*Constructiva aleatoria basada en constructiva*/
		
		Resultado res = new Resultado();
		
		int i; 
		int N1 = n1 + np1;
		int N2 = n2 + np2;
		int M = m + mp;
		
		/*Nodo[] IV1 = new Nodo[N1], IV2 = new Nodo[N2];
		Eje[] IV1V2 = new Eje[M];
		
		for( i = 0; i < n1; i++ )
			IV1[i] = new Nodo(v1[i],false);
		
		for( i = 0; i < np1; i++ )
			IV1[n1+i] = new Nodo(vp1[i],true);
		
		for( i = 0; i < n2; i++ )
			IV2[i] = new Nodo(v2[i],false);
		
		for( i = 0; i < np2; i++ )
			IV2[n2+i] = new Nodo(vp2[i],true);
		
		for( i = 0; i < m; i++ )
			IV1V2[i] = v1v2[i];
		
		for( i = 0; i < mp; i++ )
			IV1V2[m+i] = vp1vp2[i];*/
		
		//cruce maximo de ejes
		this.cruces = M*(M-1);
		//solucion optima
		this.Vo1 = new int[N1];
		this.Vo2 = new int[N2];
		
		int cantIterSinMejorar = 0;
		
		for(i = 0; cantIterSinMejorar < 10 && i< (N1+N2); i++)
		{
			localSearchRandom localSearch = new localSearchRandom();
			localSearch.DGIB(n1, v1, n2, v2, m, v1v2, np1, vp1, np2, vp2, mp, vp1vp2);
			
			if(cruces > localSearch.cruces)
			{
				cruces = localSearch.cruces;
				System.arraycopy(localSearch.Vo1, 0,this.Vo1, 0, N1); 
				System.arraycopy(localSearch.Vo2, 0,this.Vo2, 0, N2); 
				cantIterSinMejorar = 0;
			}
			else
			{
				cantIterSinMejorar++;
			}
		}
		
		res.kid = cruces;
		res.n_iv1 = N1;
		res.iv1 = Vo1; 
		res.n_iv2 = N2;
		res.iv2 = Vo2;
		
		return res;
	}
}